package com.guomei.utils;

import com.guomei.constans.ResultCode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一返回结果封装
 * 支持 JSON 序列化，便于接口返回标准化格式
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    /**
     * 状态码（自定义规范：如 200 成功，400 失败，500 系统异常等）
     */
    private int code;

    /**
     * 返回消息（成功/失败描述）
     */
    private String msg;

    /**
     * 返回数据（泛型支持，可传任意类型：对象、列表、分页等）
     */
    private T data;

    // ====================== 常用静态方法（简化调用） ======================

    /**
     * 成功返回（无数据）
     */
    public static Result<Void> success() {
        return Result.<Void>builder()
                .code(ResultCode.SUCCESS.getCode())
                .msg(ResultCode.SUCCESS.getMsg())
                .build();
    }


    /**
     * 成功返回（无数据）
     */
    public static <T> Result<T> success(String msg, T data) {
        return Result.<T>builder()
                .code(ResultCode.SUCCESS.getCode())
                .msg(msg)
                .data(data)
                .build();
    }

    /**
     * 成功返回（带数据）
     */
    public static <T> Result<T> success(T data) {
        return Result.<T>builder()
                .code(ResultCode.SUCCESS.getCode())
                .msg(ResultCode.SUCCESS.getMsg())
                .data(data)
                .build();
    }

    /**
     * 成功返回（带数据）
     */
    public static <T> Result<T> success(String msg) {
        return Result.<T>builder()
                .code(ResultCode.SUCCESS.getCode())
                .msg(msg)
                .build();
    }

    /**
     * 失败返回（自定义消息）
     */
    public static <T> Result<T> fail(String msg) {
        return Result.<T>builder()
                .code(ResultCode.FAIL.getCode())
                .msg(msg)
                .build();
    }

    /**
     * 失败返回（自定义状态码 + 消息）
     */
    public static <T> Result<T> fail(int code, String msg) {
        return Result.<T>builder()
                .code(code)
                .msg(msg)
                .build();
    }

    /**
     * 失败返回（自定义状态码 + 消息）
     */
    public static <T> Result<T> fail(int code, String msg, T data) {
        return Result.<T>builder()
                .code(code)
                .msg(msg)
                .data(data)
                .build();
    }

    /**
     * 系统异常返回（简化调用）
     */
    public static <T> Result<T> error(String msg) {
        return Result.<T>builder()
                .code(ResultCode.ERROR.getCode())
                .msg(msg)
                .build();
    }
}
